package main

import (
	"fmt"
	"reflect"
	"time"
)

// 指针获取反射对象时,可以通过reflect.Elem()方法获取
func main() {

	type cat struct {
		Cname string `json:"cname"`
		Birth string `json:"birth"`
	}

	birthDate := time.Now().Format("2006-04-02")

	ins := &cat{
		Cname: "zhangsan",
		Birth: birthDate,
	}
	//获取结构体实例的反射对象
	typeOfCat := reflect.TypeOf(ins)
	//显示反射类型对象的名称和种类		类型是一个指针
	fmt.Printf("name: %v , kind: %v \n", typeOfCat.Name(), typeOfCat.Kind())

	//取类型真正的name和类型
	typeOfCat = typeOfCat.Elem()

	fmt.Printf("elemName: %v , elemKind: %v \n", typeOfCat.Name(), typeOfCat.Kind())

	//通过反射获取结构体的字段
	structName := typeOfCat.Field(0)
	fmt.Printf("第一个结构字段 %v \n", structName)

	structBirth := typeOfCat.Field(1)
	fmt.Printf("第二个结构字段 %v \n", structBirth)

	//获取结构体的指定字段
	typeName, flag := typeOfCat.FieldByName("Cname")
	if flag {
		fmt.Printf("获取指定结构体的字段  %v", typeName)
	}

}
